package com.mango.game.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.sql.Types;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * Mybatis-plus 代码生成器
 */
public class MybatisCodeGenerator {
    // 需要生成的数据库表
    private static final List<String> DB_TABLE = Arrays.asList(
            "user_info",
            "product_info",
            "t_test2"
    );

    public static void main(String[] args) {
        fastCodeGenerator();
    }

    public static void fastCodeGenerator() {
        FastAutoGenerator
                .create(
                        "jdbc:mysql://localhost:3306/game-center",
                        "root",
                        "1234"
                )
                .globalConfig(builder -> {
                    builder.author("Mango") // 设置作者
                            .disableOpenDir()   // 生成后不打开目录
                            // .enableSwagger() // 开启 swagger 模式
                            .outputDir("src/main/java"); // 指定输出目录
                })
                .dataSourceConfig(builder ->
                        builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                            int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                            if (typeCode == Types.SMALLINT) {
                                return DbColumnType.INTEGER;    // 自定义类型转换
                            }
                            return typeRegistry.getColumnType(metaInfo);
                        })
                )
                .packageConfig(builder ->
                        builder.parent("com.mango.game") // 设置父包名
                                // .moduleName("") // 设置父包模块名
                                .mapper("mapper")
                                .entity("entity")
                                .service("service")
                                .controller("controller")
                                .pathInfo(Collections.singletonMap(OutputFile.xml, "src/main/resources/mappers")) // 设置mapperXml生成路径
                )
                .strategyConfig(builder ->
                        builder/*.addInclude(DB_TABLE)*/ // 设置需要生成的表名
                                 .addTablePrefix("flyway_") // 设置过滤表前缀
                                .entityBuilder()
                                .enableLombok() // 使用 Lombok
                                .enableRemoveIsPrefix() // bool 类型不加 is 前缀
                                .enableTableFieldAnnotation()   // 字段添加@TableField注解
                                .controllerBuilder()
                                .enableRestStyle()
                                .mapperBuilder()
                                .enableBaseResultMap()  // 生成ResultMap
                                .enableBaseColumnList() // 生成ColumnList
                                // .enableFileOverride()   // 覆盖已有文件
                                // .serviceBuilder().disable() // 禁用Service
                                // .controllerBuilder().disable()  // 禁用Controller
                )
                // .templateEngine(new VelocityTemplateEngine()) // 使用Velocity引擎模板 (需要在pom.xml单独引入依赖)
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板 (需要在pom.xml单独引入依赖)
                .execute();
    }

}
